package de.hdu.pms.ctrl;

import java.io.IOException;
import java.util.Calendar;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.log4j.Logger;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.RequestToViewNameTranslator;

import de.hdu.pms.dao.ArbeitstagDao;
import de.hdu.pms.dao.MitarbeiterDao;
import de.hdu.pms.dao.PausenDao;
import de.hdu.pms.dao.ProjektzeitDao;
import de.hdu.pms.model.Arbeitstag;
import de.hdu.pms.model.Basis;
import de.hdu.pms.model.Mitarbeiter;
import de.hdu.pms.model.Pausen;
import de.hdu.pms.model.Projektzeit;
import de.hdu.pms.dao.BasisDao;

@Controller
public class HomeController {
	private static Logger Log = Logger.getLogger(HomeController.class);
	private ArbeitstagDao arbeitstagDao = null;
	private PausenDao pausenDao = null;
	private ProjektzeitDao projektzeitDao = null;
	private MitarbeiterDao mitarbeiterDao = null;
	private BasisDao basisDao = null;
	private int start = 0;
	

	
	
	public void setArbeitstagDao(ArbeitstagDao arbeitstagDao) {
		this.arbeitstagDao = arbeitstagDao;
	}

	public void setMitarbeiterDao(MitarbeiterDao mitarbeiterDao) {
		this.mitarbeiterDao = mitarbeiterDao;
	}

	public void setBasisDao(BasisDao basisDao) {
		this.basisDao = basisDao;
	}
	
	public void setPausenDao(PausenDao pausenDao) {
		this.pausenDao = pausenDao;
	}

	public void setProjektzeitDao(ProjektzeitDao projektzeitDao) {
		this.projektzeitDao = projektzeitDao;
	}

	/** Standard Handler for welcome view.
	 * 	This handler uses the {@link RequestToViewNameTranslator} for the logic
	 * 	ViewName to find the URL 'index.html'
	 * @return ViewName "home.jps" selectiert die View "/view/home.jsp"
	 * @author BBV
	 * @throws IOException 
	 * @throws ServletException 
	 */
	
	@RequestMapping("/index.html")
	public ModelAndView login(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException{
		if(start == 0){
			Log.info("Init DB Values!");
			start = 1;
			this.initDBValues();
		}
		this.chronJobSimulation();
		Log.info("welcome");
		ModelAndView mv = new ModelAndView();
		mv.addObject("title", "Herzlich Willkommen");
		//HttpSession session = request.getSession(true);
		mv.addObject("message", "Bitte loggen Sie sich ein.");
		mv.setViewName("home");

		return mv;
	}	

	@RequestMapping("/logout.html")
	public ModelAndView logout(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException{
		Log.info("welcome");
		ModelAndView mv = new ModelAndView();
		mv.addObject("title", "Herzlich Willkommen");
		HttpSession session = request.getSession(true);
		session.removeAttribute("logged_in");
		session.removeAttribute("user");
		session.removeAttribute("admin");
		session.invalidate();
		mv.addObject("message", "Bitte loggen Sie sich ein.");
		mv.setViewName("home");
		return mv;
	}
	
	/**
	 * Function ChronJobSimulation
	 * Closes open Workdays, Breaks and projects.
	 * @author BBV
	 */
	
	private void chronJobSimulation(){
		Calendar heute = Calendar.getInstance();
		heute.set(Calendar.HOUR_OF_DAY, 23);
		heute.set(Calendar.MINUTE, 59);
		heute.set(Calendar.SECOND, 59);
		List<Arbeitstag> atag = arbeitstagDao.findCron(heute.getTime());
		List<Pausen> pausen = pausenDao.findCron(heute.getTime());
		List<Projektzeit> pz = projektzeitDao.findCron(heute.getTime());
		for(Arbeitstag a : atag){
			a.setAtag_bis(heute.getTime());
			arbeitstagDao.save(a);
		}
		for(Pausen p : pausen){
			p.setPause_stop(heute.getTime());
			pausenDao.save(p);
		}
		for(Projektzeit p : pz){
			p.setProjekt_bis(heute.getTime());
			projektzeitDao.save(p);
		}
	}
	
	/**
	 * Initialization a standard administration user to keep the program configurable,
	 * when using a clean Database
	 * Initialization Standard Bases into the DB.
	 * @author BBV
	 * @return void.
	 *
	 **/
	
	private void initDBValues(){
		if(basisDao.count() == 0){
			Log.info("keine Basen gefunden!");
			Basis basis = new Basis();
			basis.setBasis_bez("Tagessoll");
			basisDao.save(basis);
			//List b_id = basisDao.findByBez("Tagessoll");
			Basis basis2 = new Basis();
			basis2.setBasis_bez("Monatssoll");
			basisDao.save(basis2);
			}
		else{
			Log.info("Basen sind vorhanden!");	
		}
		if(mitarbeiterDao.isAdmin() == 0){
			Log.info("Kein Admin gefunden!");
			Mitarbeiter mitarbeiter = new Mitarbeiter();
			mitarbeiter.setMit_vorname("");
			mitarbeiter.setMit_name("Admin");
			mitarbeiter.setMit_login("Admin");
			mitarbeiter.setMit_pw("geheim");
			mitarbeiter.setMit_isadmin(true);
			mitarbeiterDao.save(mitarbeiter, 1);
		}
		else{
		Log.info("Admin gefunden!");
		}
		
		
	}
}
